Перейти к основному содержимому

5.05. Условные операции

Разработчику Архитектору

Условные операции

Программы редко выполняются линейно. Чаще всего они должны принимать решения на основе данных. Для этого в C# используются условные операции — конструкции, которые позволяют выполнять разные блоки кода в зависимости от условия.

Самый базовый способ ветвления — оператор if. Он проверяет условие и, если оно истинно (true), выполняет блок кода.

Синтаксис:

if (условие)
{
// код, если условие истинно
}
else if (другое_условие)
{
// код, если первое ложно, а второе — истинно
}
else
{
// код, если все условия ложны
}

Пример:

int age = 20;

if (age < 13)
{
Console.WriteLine("Ребёнок");
}
else if (age < 18)
{
Console.WriteLine("Подросток");
}
else
{
Console.WriteLine("Взрослый");
}

else if может быть сколько угодно.

else — необязательный, но должен быть последним.

Если блок состоит из одной строки, фигурные скобки можно опустить (но не рекомендуется):

if (age > 18)
Console.WriteLine("Совершеннолетний");

switch используется, когда нужно выбрать один из нескольких вариантов на основе значения переменной.

Синтаксис:

switch (выражение)
{
case значение1:
// код
break;
case значение2:
// код
break;
default:
// код по умолчанию
break;
}

Пример:

string day = "понедельник";

switch (day)
{
case "понедельник":
Console.WriteLine("Начало недели");
break;
case "пятница":
Console.WriteLine("Почти выходные");
break;
case "суббота":
case "воскресенье":
Console.WriteLine("Выходные!");
break;
default:
Console.WriteLine("Обычный день");
break;
}

case должен завершаться break, return, throw или goto (иначе ошибка компиляции — "fall-through" запрещён).

Можно группировать case (как в субботу/воскресенье).

default — необязательный, но рекомендуется.

Начиная с C# 8, появилось выражение switch (switch expression) — более лаконичный и функциональный способ записи switch. Он возвращает значение, как тернарный оператор, и использует стрелку =>.

Это очень симпатичный способ заменить большое количество if/else:

var result = выражение switch
{
значение1 => результат1,
значение2 => результат2,
_ => значение_по_умолчанию
};

Здесь «_» — это discard, аналог default.

Пример:

string day = "пятница";

string mood = day switch
{
"понедельник" => "Устал...",
"пятница" => "Йеее, выходные!",
"суббота" => "Отдыхаю",
"воскресенье" => "Грущу перед понедельником",
_ => "Нормально"
};

Console.WriteLine(mood); // "Йеее, выходные!"

switch и switch expression поддерживают pattern matching — проверку типа, значения и структуры.

object value = "Hello";

string type = value switch
{
null => "Пусто",
int => "Целое число",
string s when s.Length > 5 => "Длинная строка",
string => "Короткая строка",
_ => "Неизвестный тип"
};

Здесь:

  • string s when s.Length > 5 — проверка типа и условия;
  • string — просто проверка типа;
  • int — тоже проверка типа.

Тернарный оператор (? : ) – сокращённая форма условия if-else. Это самая короткая форма ветвления. Используется, когда нужно выбрать одно из двух значений.

string result = (score >= 50) ? "Прошёл" : "Не прошёл";

Синтаксис стандартный:

условие ? значение_если_истина : значение_если_ложь

Можно вкладывать! Но не злоупотребляйте, а то будет нечитаемо:

string category = age < 13 ? "Ребёнок" : 
age < 18 ? "Подросток" : "Взрослый";

Такой код читается плохо. Лучше использовать if или switch expression.